// 基于 SnowLang Project (https://gitee.com/jcnc-org/snow) 的衍生作品
// 原始版权归属: Copyright © 2025 Ke Xu (Luke)
// 本实现版权归属: Copyright © 2025 Sany
// 遵循 Apache License 2.0 授权
package main

import (
	"flag"
	"fmt"
	"os"

	"gitee.com/xntk2381/cc/cli/api"
	"gitee.com/xntk2381/cc/cli/commands"
)

// Snow 编程语言的当前版本号，从资源文件中加载。
const SNOW_VERSION = "0.0.0" // 此处应替换为实际从资源文件加载版本号的逻辑

// 可用子命令名称与对应命令处理器的映射表。
var COMMANDS = map[string]api.CLICommand{
	// "generate": commands.NewGenerateCommand,
	// "compile":  commands.NewCompileCommand,
	"run": commands.RunCommand{},
	// "version":  commands.NewVersionCommand,
	// "init":     commands.NewInitCommand,
	// "build":    commands.NewBuildCommand,
	// "install":  commands.NewInstallCommand,
	// "publish":  commands.NewPublishCommand,
	// "clean":    commands.NewCleanCommand,
}

func main() {
	if len(os.Args) < 2 {
		printGeneralUsage()
		os.Exit(0)
	}

	cmdName := os.Args[1]
	cmd, exists := COMMANDS[cmdName]

	// 未知子命令处理
	if !exists {
		fmt.Fprintf(os.Stderr, "Unknown command: %s\n", cmdName)
		printGeneralUsage()
		os.Exit(1)
	}

	// 为子命令创建 flagset
	flagSet := flag.NewFlagSet(cmdName, flag.ExitOnError)
	flagSet.Usage = cmd.PrintUsage

	// 解析子命令参数
	if err := flagSet.Parse(os.Args[2:]); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	}

	// 执行子命令并根据返回的退出码退出
	if exitCode, err := cmd.Execute(flagSet.Args()); err != nil {
		fmt.Fprintln(os.Stderr, err)
		os.Exit(1)
	} else {
		os.Exit(exitCode)
	}
}

// func main() {
// 	args := []string{
// 		"a",
// 		"run",
// 		"Main.water",
// 	}

// 	cmdName := args[1]
// 	cmd, exists := COMMANDS[cmdName]

// 	// 未知子命令处理
// 	if !exists {
// 		fmt.Fprintf(os.Stderr, "Unknown command: %s\n", cmdName)
// 		printGeneralUsage()
// 		os.Exit(1)
// 	}

// 	// 为子命令创建 flagset
// 	// flagSet := flag.NewFlagSet(cmdName, flag.ExitOnError)
// 	// flagSet.Usage = cmd.PrintUsage

// 	// // 解析子命令参数
// 	// if err := flagSet.Parse(os.Args[2:]); err != nil {
// 	// 	fmt.Fprintln(os.Stderr, err)
// 	// 	os.Exit(1)
// 	// }

// 	// 执行子命令并根据返回的退出码退出
// 	if exitCode, err := cmd.Execute(args[2:]); err != nil {
// 		fmt.Fprintln(os.Stderr, err)
// 		os.Exit(1)
// 	} else {
// 		os.Exit(exitCode)
// 	}
// }

// printGeneralUsage 打印全局用法说明
func printGeneralUsage() {
	fmt.Println("Available commands:")
	for cmd := range COMMANDS {
		fmt.Printf("  %s\n", cmd)
	}
	fmt.Println("\nUse -h or --help after a command for more information")
}

// 以下为假设的命令接口定义，需根据实际情况调整
